package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.PuestoDAO;
import mx.ipn.persistencia.dao.TipoEmpleadoDAO;

import mx.ipn.to.PuestoTO;

public class PuestoDAOMySQL implements PuestoDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(PuestoDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO puesto(nombre,descripcion,id_tipo_empleado,activo) VALUES(?,?,?,?)";
	private static final String DESACTIVA = "UPDATE puesto SET activo=false WHERE id_puesto=?";
	private static final String UPDATE = "UPDATE puesto SET nombre=?,descripcion=?,id_tipo_empleado=?,activo=? WHERE id_puesto=?";
	private static final String FINDBYID = "SELECT * FROM puesto WHERE id_puesto=?";
	private static final String FINDBYNOMBRETIPOEMPLEADO = "SELECT * FROM puesto WHERE UPPER(REPLACE(nombre,' ',''))=? and id_tipo_empleado=?";
	private static final String SELECT = "SELECT * FROM puesto";
	private static final String SELECTACTIVO = "SELECT * FROM puesto WHERE activo=true";
	private static final String SELECTBYTIPO = "SELECT * FROM puesto WHERE id_tipo_empleado=?";
	private static final String SELECTACTIVOBYTIPO = "SELECT * FROM puesto WHERE id_tipo_empleado=? and activo=true";

	@Override
	public short DesActivaPuesto(short idPuesto) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DESACTIVA);

			ps.setInt(1, idPuesto);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public PuestoTO findPuestoById(short idPuesto) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setShort(1, idPuesto);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla TIPOEMPLEADO
				TipoEmpleadoDAO tipoEmpleadoDAO = fabricaMySQL
						.getTipoEmpleadoDAO();

				PuestoTO puestoTO = new PuestoTO(idPuesto, rs
						.getString("nombre"), rs.getString("descripcion"),
						tipoEmpleadoDAO.findTipoEmpleadoById(rs
								.getShort("id_tipo_empleado")), rs
								.getBoolean("activo"));

				ps.close();
				conexion.close();
				return puestoTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public PuestoTO findPuestoByNombreTipoEmpleado(String nombre,
			short idTipoEmpleado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(FINDBYNOMBRETIPOEMPLEADO);

			ps.setString(1, nombre);
			ps.setShort(2, idTipoEmpleado);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla Cliente
				TipoEmpleadoDAO tipoEmpleadoDAO = fabricaMySQL
						.getTipoEmpleadoDAO();

				PuestoTO puestoTO = new PuestoTO(rs.getShort("id_puesto"), rs
						.getString("nombre"), rs.getString("descripcion"),
						tipoEmpleadoDAO.findTipoEmpleadoById(rs
								.getShort("id_tipo_empleado")), rs
								.getBoolean("activo"));

				ps.close();
				conexion.close();
				return puestoTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertPuesto(PuestoTO puestoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setString(1, puestoTO.getNombre());
			ps.setString(2, puestoTO.getDescripcion());
			ps.setShort(3, puestoTO.getTipoEmpleadoTO().getIdTipoEmpleado());
			ps.setBoolean(4, puestoTO.getActivo());
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<PuestoTO> selectPuesto() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			TipoEmpleadoDAO tipoEmpleadoDAO = null;

			ArrayList<PuestoTO> puestoTO = null;
			PuestoTO puestoTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (puestoTO == null) {
					puestoTO = new ArrayList<PuestoTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					tipoEmpleadoDAO = fabricaMySQL.getTipoEmpleadoDAO();
				}

				puestoTO2 = new PuestoTO(rs.getShort("id_puesto"), rs
						.getString("nombre"), rs.getString("descripcion"),
						tipoEmpleadoDAO.findTipoEmpleadoById(rs
								.getShort("id_tipo_empleado")), rs
								.getBoolean("activo"));

				puestoTO.add(puestoTO2);
			}
			ps.close();
			conexion.close();
			return puestoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<PuestoTO> selectPuestoActivo() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			TipoEmpleadoDAO tipoEmpleadoDAO = null;

			ArrayList<PuestoTO> puestoTO = null;
			PuestoTO puestoTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTACTIVO);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (puestoTO == null) {
					puestoTO = new ArrayList<PuestoTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					tipoEmpleadoDAO = fabricaMySQL.getTipoEmpleadoDAO();
				}

				puestoTO2 = new PuestoTO(rs.getShort("id_puesto"), rs
						.getString("nombre"), rs.getString("descripcion"),
						tipoEmpleadoDAO.findTipoEmpleadoById(rs
								.getShort("id_tipo_empleado")), rs
								.getBoolean("activo"));

				puestoTO.add(puestoTO2);
			}
			ps.close();
			conexion.close();
			return puestoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public PuestoTO selectPuestoActivoByTipoEmpleado(short idTipoEmpleado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			TipoEmpleadoDAO tipoEmpleadoDAO = null;

			ArrayList<Short> listIdPuesto = null;
			ArrayList<String> listNombre = null;
			ArrayList<String> listDescripcion = null;
			ArrayList<Boolean> listActivo = null;

			PuestoTO puestoTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTACTIVOBYTIPO);
			ps.setShort(1, idTipoEmpleado);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdPuesto == null) {

					listIdPuesto = new ArrayList<Short>();
					listNombre = new ArrayList<String>();
					listDescripcion = new ArrayList<String>();
					listActivo = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					tipoEmpleadoDAO = fabricaMySQL.getTipoEmpleadoDAO();
				}

				listIdPuesto.add(rs.getShort("id_puesto"));
				listNombre.add(rs.getString("nombre"));
				listDescripcion.add(rs.getString("descripcion"));
				listActivo.add(rs.getBoolean("activo"));
			}
			if (listIdPuesto != null) {
				
				String[] arrDescripcion = (String[])listDescripcion.toArray(new String[listDescripcion.size()]);
				String[] arrNombre = (String[])listNombre.toArray(new String[listNombre.size()]);
				Short[] arrIdPuesto = (Short[])listIdPuesto.toArray(new Short[listIdPuesto.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				
				puestoTO = new PuestoTO(arrIdPuesto, arrNombre,
						arrDescripcion, tipoEmpleadoDAO
								.findTipoEmpleadoById(idTipoEmpleado),
						arrActivo);
			}
			ps.close();
			conexion.close();
			return puestoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public PuestoTO selectPuestoByTipoEmpleado(short idTipoEmpleado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			TipoEmpleadoDAO tipoEmpleadoDAO = null;

			ArrayList<Short> listIdPuesto = null;
			ArrayList<String> listNombre = null;
			ArrayList<String> listDescripcion = null;
			ArrayList<Boolean> listActivo = null;

			PuestoTO puestoTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYTIPO);
			ps.setShort(1, idTipoEmpleado);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdPuesto == null) {

					listIdPuesto = new ArrayList<Short>();
					listNombre = new ArrayList<String>();
					listDescripcion = new ArrayList<String>();
					listActivo = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					tipoEmpleadoDAO = fabricaMySQL.getTipoEmpleadoDAO();
				}

				listIdPuesto.add(rs.getShort("id_puesto"));
				listNombre.add(rs.getString("nombre"));
				listDescripcion.add(rs.getString("descripcion"));
				listActivo.add(rs.getBoolean("activo"));
			}
			if (listIdPuesto != null) {
				
				String[] arrDescripcion = (String[])listDescripcion.toArray(new String[listDescripcion.size()]);
				String[] arrNombre = (String[])listNombre.toArray(new String[listNombre.size()]);
				Short[] arrIdPuesto = (Short[])listIdPuesto.toArray(new Short[listIdPuesto.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				
				puestoTO = new PuestoTO(arrIdPuesto, arrNombre,
						arrDescripcion, tipoEmpleadoDAO
								.findTipoEmpleadoById(idTipoEmpleado),
						arrActivo);
			}
			ps.close();
			conexion.close();
			return puestoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updatePuesto(PuestoTO puestoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);
			ps.setString(1, puestoTO.getNombre());
			ps.setString(2, puestoTO.getDescripcion());
			ps.setShort(3, puestoTO.getTipoEmpleadoTO().getIdTipoEmpleado());
			ps.setBoolean(4, puestoTO.getActivo());
			ps.setShort(5, puestoTO.getIdPuesto());
			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
